package com.tedu.api;

import org.junit.Test;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.function.BiConsumer;

public class MapAPI {
    /**
     * 包位置：Java.util
     * 作用：一个元素由两个对象构成：分别   建：key  对：Value
     *           保存一个元素：key---value【保存一对：两个对象】
     *用途：通常与数据库搭配使用
     * 特点：建：无序，无下标，不可重复，实际存HashSet
     *            值：存泛型约束的类型，值可以重复，实际存Collection
     *Map 接口对象创建---实现类：
     * HashMap：【常用：HashMap的方法与Map方法类似】有键值对组成，使用哈希算法实现
     * 键值对可以为null，建中只允许一个null
     * LinkedHashMap：【不常用：方法与HashMap类似】两端插入和增加效率高
     * TreeMap：【不用】【算法：红黑树】性能：效率较低，线程安全
     * HashTable【不用】JDK1.0版本，由哈希算法实现，解决多线程问题
     * ConcurrentHashMap：【常用】多线程
     */
@Test
    public  void  testMap(){
    //创建Map映射集合接口
    Map<Object,String> map=new HashMap<>();
    /**
     * put(键key，值v)   返回值：V  value---实际Collection
     * 作用：映射集合存入一堆元素：键和值
     */
    map.put("你好","喜喜");map.put("我好","哈哈");map.put("大家好","呵呵");//key键：set集合无序无下标，唯一  //key值一致，进行覆盖
    //需求：获取一组元素中值："你好","喜喜"
    String s=map.get("你好");
    System.out.println("通过键找值"+s);
    //没有这个值，自动按照Collection对象，补对象默认：null
    System.out.println("通过键找值【键不存在】"+map.get("哈哈"));
    //删除元素中：键   remove（key）   返回值：V  value Collection
    map.remove("你好");
    System.out.println("Map集合"+map);
    //size（）  获取映射集合的元素个数
    System.out.println("Map集合元素总数"+map.size());

    //containsKey(key) 判断键是否存在   返回值：Boolean
    //containsValue(Value)  判断值是否存在   返回值：Boolean

    boolean c1= map.containsKey("我好");
    boolean c2=map.containsValue("哈哈");
    System.out.println("判断值是否存在"+c1);
}
/**
 * Map映射集合中：一组键值对存入【一组元素：Entry】
 * 遍历映射集合：遍历所有的值，遍历所有的Entry
 * keySet：获取集合中所有的键
 * values：获取集合中所有的值
 * entrySet：获取集合中所有的【entry：键与值】
 */

@Test
    public  void  testMap2(){
    Map<Object,String> c1=new HashMap<>();
    c1.put("保定","火烧");c1.put("北京","鸡肉卷");c1.put("上海","鸡排");
    //1.keySet 方法获取所有的键值
    Set<Object> set=c1.keySet();
    //遍历所有的键：增强for
    for(Object e:set){//从set集合中获取所哟有键
        System.out.println("获取所有键"+e);
    }
    //2.values()  遍历值
    Collection<String> collection=c1.values();
    for (String b:collection);{
       /* System.out.println("获取到所有值"+);*/
    }
    //3.entrySet()   获取所有entry
    //返回值：Set<Map.Entry<>>
    //Entry类型：Set<Map.Entry<>>
    //Entry存键值的对象--Map增加一个针对"键值对"的对象
    //Map.Entry     【Map接口.Entry对象】获取到表示所有的Entry的方法
    Set<Map.Entry<Object,String>> c3=c1.entrySet();
    for (Map.Entry<Object,String>c2:c3){
        //System.out.println("所有entry"+c2)
        //Entry中  key与Value 方法:getKey   getValue
        Object key=c2.getKey();
        String value=c2.getValue();
        System.out.println("打印Entry中的键与值");
    }
}
/**
 * forEach(new  BiConsumer)
 * BiConsumer()接口 ----封装Entry对象的键与值
 * 作用:遍历集合中所有的entry[键与值]
 */
@Test
    public void testForEach(){
    Map<Object,String> map=new HashMap<>();
    map.put("你好","喜喜");map.put("我好","哈哈");map.put("大家好","呵呵");
    //forEach(接口)遍历映射集合:键与值
    map.forEach(new BiConsumer<Object, String>(){
        //accept(K,V)  获取Entry中所有的键与值
        public void accept(Object o, String s) {
            System.out.println("所有的键："+o);
            System.out.println("所有的值:"+s);
        }
    });
}
/**
 * putIfAbsent()
 * 作用:存一组entry,先判断指定的键是否存在,不存在将键值插入
 *                                    存在键值不插入
 */
@Test
    public  void testHashMap(){
    Map<Object,String> c4=new HashMap<>();
    c4.put("喜喜","你好");c4.put("哈哈","我好");c4.put("呵呵","大家好");
    c4.putIfAbsent("奶龙","贝利亚");
    c4.put("胖猫","劳达");
    c4.putIfAbsent("将军","蔡徐坤");//相同键  不插入
    System.out.println("HashMap集合"+c4);









}




















}
